/*************************************************************************
. CLASS 명 : FormatHelper
. 작 업 자 :
. 작 업 일 :
. 기    능 : 날자나 숫자의 데이터 포멧을 관리하는 유틸리티 class
. ---------------------------- 변 경 이 력 --------------------------------
. 번호  작 업 자   작      업     일   변경내용                       비고
. ---- --------  -----------------  -------------------------    --------

**************************************************************************/
package com.sunny.hp.common.util;

import java.util.*;
import java.io.*;
import java.text.*;

public class FormatHelper {

    UtilHelper util = new UtilHelper();

    /**
    * 년도, 월, 일을 flag로 연결하여 반환한다.
    * @param   year    복사할 파일의 위치와 이름
    * @param   month   복사되어질 파일의 위치와 이름
    * @param   day     동일 파일이 존재할 경우 Overwrite 여부 체크
    * @param   flag    원본 파일의 삭제 여부
    * @return  String  날자
    */
    public String dateFormat(int year, int month, int day, String flag) {
        String newFormat = "";
        try {
            if(flag != null) {
                newFormat = util.fillLeft(String.valueOf(year),  4, "0") + flag
                          + util.fillLeft(String.valueOf(month), 2, "0") + flag
                          + util.fillLeft(String.valueOf(day),   2, "0");
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }

        return newFormat;
    }


    /**
    * 년도, 월, 일을 flag로 연결하여 반환한다.
    * @param   year    복사할 파일의 위치와 이름
    * @param   month   복사되어질 파일의 위치와 이름
    * @param   day     동일 파일이 존재할 경우 Overwrite 여부 체크
    * @param   flag    원본 파일의 삭제 여부
    * @return  String  날자
    */
    public String dateFormat(String year, String month, String day, String flag) {
        String newFormat = "";
        try {
            if(year!=null && month!=null && day!=null) {
                if(flag != null) {
                    newFormat = util.fillLeft(year, 4, "0") + flag
                              + util.fillLeft(month, 2, "0") + flag
                              + util.fillLeft(day, 2, "0");
                }
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }

        return newFormat;
    }


    public String timeFormat(int h, int m, int s, String flag) {
        String newFormat = "";
            try {
                if(flag != null) {
                    newFormat = util.fillLeft(String.valueOf(h),  2, "0") + flag
                              + util.fillLeft(String.valueOf(m), 2, "0") + flag
                              + util.fillLeft(String.valueOf(s),   2, "0");
                }
        }
        catch(Exception e) {
            e.printStackTrace();
        }

        return newFormat;
    }







    /**
    * 년도, 월, 일을 flag로 연결하여 반환한다.
    * @param   dateFull    날자(YYYYMMDD 형식)
    * @param   flag        문자열 연결자("-" => YYYY-MM-DD)
    * @return  String      flag로 연결된 문자열
    */
    public String dateFormat(String dateFull, String flag) {
        String newFormat = "";
        if(dateFull != null && !dateFull.equals("") && dateFull.length() > 7 && flag != null) {
            dateFull = dateFull.trim();
            int len  = dateFull.length();
            if(len >= 8) {
                newFormat = dateFormat(dateFull.substring(0, 4), dateFull.substring(4, 6), dateFull.substring(6, 8), flag);
            }
            else if(len >= 6) {
                newFormat = dateFormat(dateFull.substring(0, 4), dateFull.substring(4, 6), dateFull.substring(6, len), flag);
            }
            else if(len >= 4) {
                newFormat = dateFormat(dateFull.substring(0, 4), dateFull.substring(4, len), "", flag);
            }
            else {
                newFormat = dateFormat(dateFull.substring(0, len), "", "", flag);
            }
        } else {
            newFormat	= dateFull;
        }


        return newFormat;
    }
    /**
     * 년도, 월, 일을 flag로 연결하여 반환한다.
     * @param   dateFull    날자(YYYYMMDD 형식)
     * @param   flag        문자열 연결자("-" => YYYY-MM-DD)
     * @return  String      flag로 연결된 문자열
     */
     public String timeFormat(String timeFull, String flag) {
         String newFormat = "";
         if(timeFull != null && !timeFull.equals("") && timeFull.length() > 5 && flag != null) {
             timeFull = timeFull.trim();
             int len  = timeFull.length();

             if(len == 6) {
                 newFormat = timeFull.substring(0, 2) + flag + timeFull.substring(2, 4) + flag + timeFull.substring(4, 6);
             }

         } else {
             newFormat	= timeFull;
         }


         return newFormat;
     }

    /**
    * 입력된 날자 문자열을 분리하여 년도, 월, 일을 String[]에 담아 반환한다.
    * @param   dateFull    날자(YYYYMMDD 형식)
    * @return  String[]    날자
    */
    public String[] dateFormat(String dateFull) {
        String[] newFormat = new String[]{"", "", ""};
        if(dateFull != null && dateFull.length() > 0) {
            dateFull = dateFull.trim();
            int len  = dateFull.length();
            if(len >= 8) {
                newFormat[0] = dateFull.substring(0, 4);
                newFormat[1] = dateFull.substring(4, 6);
                newFormat[2] = dateFull.substring(6, 8);
            }
            else if(len >= 6) {
                newFormat[0] = dateFull.substring(0, 4);
                newFormat[1] = dateFull.substring(4, 6);
                newFormat[2] = dateFull.substring(6, len);
            }
            else if(len >= 4) {
                newFormat[0] = dateFull.substring(0, 4);
                newFormat[1] = dateFull.substring(4, len);
                newFormat[2] = "";
            }
            else {
                newFormat[0] = dateFull.substring(0, len);
                newFormat[1] = "";
                newFormat[2] = "";
            }
        }

        return newFormat;
    }


    /**
    * 기능 : 3개의 문자열로 나뉘어져 있는 전화번호를 "-"으로 연결된 하나의 문자열로 변환하여 반환한다.
    * 입력화면에서 나뉘어져 있는 각각의 전화번호 필드를 DB의 하나의 Column에 넣을때 사용한다.
    * param    str1      지역번호
    * param    str2      국번
    * param    str3      번호
    *@return   String    하나의 문자열로 연결된 문자열
    */
    public String convTelNumber(String str1, String str2, String str3) {
        String telNumber = "";
        str1 = (str1 == null) ? "" : str1;
        str2 = (str2 == null) ? "" : str2;
        str3 = (str3 == null) ? "" : str3;

        return str1 + "-" + str2 + "-" + str3;
    }

    /**
    * 기능 : 3개의 문자열로 나뉘어져 있는 전화번호를 "-"으로 연결된 하나의 문자열로 변환하여 반환한다.
    * 입력화면에서 나뉘어져 있는 각각의 전화번호 필드를 DB의 하나의 Column에 넣을때 사용한다.
    * param    str1      지역번호
    * param    str2      국번
    * param    str3      번호
    *@return   String[]  전화번호 데이터
    */
    public String[] convTelNumber(String telNumber) {
        String[] str = new String[]{"", "", ""};
        if(telNumber != null) {
            int index   = 0;
            String temp = "";
            int maxLen  = telNumber.length();
            for(int i=0; i<maxLen; i++) {
                temp = telNumber.substring(i, i+1);
                if("-".equals(temp)) {
                    str[index] += "";
                    index++;
                }
                else {
                    str[index] += temp;
                }
            }
        }

        return str;
    }


    /**
    * 기능 : 우편번호 6자리를 받아 3자리씩 끊어 flag로 구분하여 연결한 문자열로 반환한다.
    * param    zipcode   우편번호(하나의 문자열)
    *@return   String[]  우편번호
    */
    public String convZipcode(String zipcode, String flag) {
        String newZipcode = "";
        if(zipcode != null && zipcode.length() != 0) {
            zipcode = zipcode.trim();
            int len = zipcode.length();
            if(len >= 6) {
                newZipcode = zipcode.substring(0, 3) + flag + zipcode.substring(3, 6);
            }
            else if(len >= 3) {
                newZipcode = zipcode.substring(0, 3) + flag + zipcode.substring(3, len);
            }
            else {
                newZipcode = zipcode.substring(0, len) + flag + "";
            }
        }

        return newZipcode;
    }


    /**
    * 기능 : 우편번호 6자리를 받아 size가 2인 1차원 배열에 3자리씩 끊어 담아 반환한다.
    * param    zipcode   우편번호(하나의 문자열)
    * param    flag      구분자
    *@return   String[]  우편번호
    */
    public String[] convZipcode(String zipcode) {
        String[] str = new String[]{"", ""};
        if(zipcode != null && zipcode.length() != 0) {
            zipcode = zipcode.trim();
            int len = zipcode.length();
            if(len >= 6) {
                str[0] = zipcode.substring(0, 3);
                str[1] = zipcode.substring(3, 6);
            }
            else if(len >= 3) {
                str[0] = zipcode.substring(0, 3);
                str[1] = zipcode.substring(3, len);
            }
            else {
                str[0] = zipcode.substring(0, len);
                str[1] = "";
            }
        }

        return str;
    }


    /**
    * 기능 : 주민번호 13자리를 받아 6, 7자리로 각각 끊어 flag로 구분하여 연결한 문자열로 반환한다.
    * param    zipcode   우편번호(하나의 문자열)
    * param    flag      구분자
    *@return   String[]  우편번호
    */
    public String convRegitNumber(String regitNumber, String flag) {
        String newRegitNuber = "";
        if(regitNumber != null && regitNumber.length() != 0) {
            regitNumber  = regitNumber.trim();
            int len = regitNumber.length();
            if(len >= 13) {
                newRegitNuber = regitNumber.substring(0, 6) + flag + regitNumber.substring(6, 13);
            }
            else if(len >= 6) {
                newRegitNuber = regitNumber.substring(0, 6) + flag + regitNumber.substring(6, len);
            }
            else {
                newRegitNuber = regitNumber.substring(0, len) + flag + "";
            }
        }

        return newRegitNuber;
    }


    /**
    * 기능 : 주민번호 13자리를 받아 6, 7자리로 각각 끊어1차원 배열에 담아 반환한다.
    * param    zipcode   우편번호(하나의 문자열)
    *@return   String[]  우편번호
    */
    public String[] convRegitNumber(String regitNumber) {
        String[] str = new String[]{"", ""};
        if(regitNumber != null && regitNumber.length() != 0) {
            regitNumber  = regitNumber.trim();
            int len = regitNumber.length();
            if(len >= 13) {
                str[0] = regitNumber.substring(0, 6);
                str[1] = regitNumber.substring(6, 13);
            }
            else if(len >= 6) {
                str[0] = regitNumber.substring(0, 6);
                str[1] = regitNumber.substring(6, len);
            }
            else {
                str[0] = regitNumber.substring(0, len);
                str[1] = "";
            }
        }

        return str;
    }


    /**
    * 기능 : 숫자 3자리 당 콤마(,) 찍어 줌   ex) ###,###,###.#####
    * param    val     문자형 숫자
    * @return  결과값
    */
    public String numberFormat(String val) {
        String ls_sign = "";
        String ls_num01 = "";
        String ls_num02 = "";
        if (util.nullCheck(val) == false && val.length() > 0) {
            if ((val.substring(0,1)).equals("-")) {
                ls_sign = "-";
                val = val.substring(1,val.length());
            }
            if ((val.indexOf(".")) != -1) {
                if ((val.length()-1) > val.indexOf(".")) ls_num02 = val.substring(val.indexOf("."), val.length());
                if ((val.indexOf(".")) == 0) val   = "0";
                else val   = val.substring(0, val.indexOf("."));
            }
            if ((val.length()) > 0) {
                for (int i = 0; i < val.length(); i++) {
                    if (i > 0 && ((val.length()-i) % 3) == 0) ls_num01 += ",";
                    ls_num01 += val.charAt(i);
                }
            }
        }
        val = ls_num01 +ls_num02;
        if (val.equals("") || val.equals("0")) return val;
        else return (ls_sign+val);
    }

    /**
     * 월 또는 일이 10보다 작으면 숫자 앞에 0을 붙여준다.
     * @param stMonthOrDay
     * @return
     */
    public String monthOrDayFormat( String stMonthOrDay )
    {
        if( !"".equals(stMonthOrDay) && stMonthOrDay != null )
        {
            return monthOrDayFormat( Integer.parseInt(stMonthOrDay) );
        }
        else
        {
            return "";
        }
    }

    /**
     * 월 또는 일이 10보다 작으면 숫자 앞에 0을 붙여준다.
     * @param nMonthOrDay
     * @return
     */
    public String monthOrDayFormat( int nMonthOrDay )
    {
        String stNewMonthOrDay = "";

        if( nMonthOrDay < 10 )
        {
            stNewMonthOrDay = "0" + nMonthOrDay;
        }
        else
        {
            stNewMonthOrDay = "" + nMonthOrDay;
        }

        return stNewMonthOrDay;
    }
}